// 拦截器的注册
import { ResolvedFn, RejectedFn } from '../types'

// 定义单个拦截器的结构，通过泛型 T 适配不同数据类型（请求配置 / 响应结果）
interface Interceptor<T> {
  resolved: ResolvedFn<T> // 成功回调，处理类型为T的数据
  rejected?: RejectedFn // 可选的错误回调
}

// 通用化拦截器的添加、删除、遍历，不关心具体是请求还是响应拦截器。
export default class InterceptorManager<T> {
  private interceptors: Array<Interceptor<T> | null>  // 存储拦截器，允许null（已删除）

  constructor() {
    this.interceptors = []// 核心是数组！
  }

  use(resolved: ResolvedFn<T>, rejected?: RejectedFn): number {
    this.interceptors.push({// 将拦截器对象添加到数组末尾
      resolved,
      rejected
    })
    return this.interceptors.length - 1  // ID为当前索引（如第一个拦截器ID=0）
  }

  // 遍历拦截器
  forEach(fn: (interceptor: Interceptor<T>) => void): void {
    this.interceptors.forEach(interceptor => {
      if (interceptor !== null) {
        fn(interceptor)
      }
    })
  }

  eject(id: number): void {
    if (this.interceptors[id]) {  // 检查ID是否有效
      this.interceptors[id] = null  // 标记为null 不直接删除数组元素 
    }
  }
}
